28707
#자료_구조 #그래프_이론 #집합과_맵 #최단_경로 #해시를_사용한_집합과_맵 #데이크스트라
https://www.acmicpc.net/problem/28707
풀이
#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
struct FHeapData
{
vector<int> Array;
int Cost;
bool operator>(const FHeapData& Another) const
{
return Cost > Another.Cost;
}
};
class FManipulator
{
public:
FManipulator()
{
cin >> l >> r >> Cost;
--l;
--r;
}
int Manipulate(vector<int>& Array) const
{
swap(Array[l], Array[r]);
return Cost;
}
private:
int l;
int r;
int Cost;
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<int> A(N);
for(int& Value : A)
{
cin >> Value;
}
int M;
cin >> M;
vector<FManipulator> Manipulators(M);
map<vector<int>, int> Table;
Table[A] = 0;
priority_queue<FHeapData, vector<FHeapData>, greater<FHeapData>> MinHeap;
FHeapData HeapData;
HeapData.Array = A;
HeapData.Cost = 0;
MinHeap.push(HeapData);
while(!MinHeap.empty())
{
HeapData = MinHeap.top();
MinHeap.pop();
if(HeapData.Cost > Table[HeapData.Array])
{
continue;
}
for(const FManipulator& Manipulator : Manipulators)
{
FHeapData Candidate = HeapData;
Candidate.Cost += Manipulator.Manipulate(Candidate.Array);
if(Table.find(Candidate.Array) == Table.end() || Candidate.Cost < Table[Candidate.Array])
{
Table[Candidate.Array] = Candidate.Cost;
MinHeap.push(Candidate);
}
}
}
sort(A.begin(), A.end());
cout << (Table.find(A) == Table.end() ? -1 : Table[A]);
return 0;
}